#include "../include/types.h"

// 32位无符号乘法（补充此函数解决__mulsi3未定义问题）
uint32 __mulsi3(uint32 a, uint32 b) {
    uint32 result = 0;
    
    while (b > 0) {
        if (b & 1) {  // 如果b的最低位为1，累加a
            result += a;
        }
        a <<= 1;  // a左移一位（乘以2）
        b >>= 1;  // b右移一位（除以2）
    }
    
    return result;
}

// 32位无符号除法
uint32 __udivsi3(uint32 a, uint32 b) {
    uint32 result = 0;
    uint32 bit = 1;
    
    if (b == 0) return 0;  // 避免除零错误
    
    // 找到除数最高位与被除数最高位对齐的位置
    while (b < a && !(b & (1U << 31))) {
        b <<= 1;
        bit <<= 1;
    }
    
    // 逐位计算商
    while (bit > 0) {
        if (a >= b) {
            a -= b;
            result += bit;
        }
        b >>= 1;
        bit >>= 1;
    }
    
    return result;
}

// 32位无符号取模
uint32 __umodsi3(uint32 a, uint32 b) {
    // 取模 = 被除数 - （商 * 除数），会调用上面的__mulsi3
    return a - (__udivsi3(a, b) * b);
}

// 64位无符号运算函数（保留不变）
uint64 __udivdi3(uint64 a, uint64 b) {
    uint64 result = 0;
    uint64 bit = 1;
    
    if (b == 0) return 0;
    
    while (b < a && !(b & (1ULL << 63))) {
        b <<= 1;
        bit <<= 1;
    }
    
    while (bit > 0) {
        if (a >= b) {
            a -= b;
            result += bit;
        }
        b >>= 1;
        bit >>= 1;
    }
    
    return result;
}


uint64 __umoddi3(uint64 a, uint64 b) {
    return a - (__udivdi3(a, b) * b);
}


uint64 __muldi3(uint64 a, uint64 b) {
    uint64 result = 0;
    
    while (b > 0) {
        if (b & 1) {
            result += a;
        }
        a <<= 1;
        b >>= 1;
    }
    
    return result;
}
